#include "crypto_common.h"

// 最简化的加密解密测试，一次只测试一轮
void minimal_test() {
    printf("=== 最简化测试（只测试一轮加密） ===\n");
    
    crypto_context_t ctx;
    unsigned char data[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
                              0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
    unsigned char backup[16];
    
    // 初始化上下文
    ctx.complexity_level = 3;
    ctx.seed = 12345;
    
    // 固定盐值
    for (int i = 0; i < SALT_LENGTH; i++) {
        ctx.salt[i] = (unsigned char)(i % 256);
    }
    
    // 固定密钥
    for (int i = 0; i < KEY_LENGTH; i++) {
        ctx.primary_key[i] = (unsigned char)((i * 37) % 256);
    }
    
    derive_keys(&ctx);
    memcpy(backup, data, 16);
    
    printf("原始数据: ");
    for (int i = 0; i < 16; i++) printf("%02x ", data[i]);
    printf("\n");
    
    // 使用简化的加密（只一轮，不使用循环移位）
    int round = 0;
    
    // 第1步：XOR
    xor_block(data, ctx.derived_keys[round], 16);
    
    // 第2步：字节替换
    substitute_bytes(data, 16, SBOX);
    
    // 跳过第3步（循环移位）
    
    // 第4步：再次XOR
    for (size_t i = 0; i < 16; i++) {
        data[i] ^= ctx.derived_keys[round][(i + round * 17) % KEY_LENGTH];
    }
    
    // 第5步：复杂变换
    for (size_t i = 0; i < 16; i++) {
        unsigned char temp = data[i];
        data[i] = ((temp << 3) | (temp >> 5)) ^ (unsigned char)(round * 19 + i * 23);
    }
    
    // 最终混淆
    for (size_t i = 0; i < 16; i++) {
        data[i] ^= ctx.salt[i % SALT_LENGTH];
    }
    
    printf("加密数据: ");
    for (int i = 0; i < 16; i++) printf("%02x ", data[i]);
    printf("\n");
    
    // 解密（逆向过程）
    
    // 逆向最终混淆
    for (size_t i = 0; i < 16; i++) {
        data[i] ^= ctx.salt[i % SALT_LENGTH];
    }
    
    // 逆向第5步
    for (size_t i = 0; i < 16; i++) {
        data[i] ^= (unsigned char)(round * 19 + i * 23);
        unsigned char temp = data[i];
        data[i] = ((temp >> 3) | (temp << 5));
    }
    
    // 逆向第4步
    for (size_t i = 0; i < 16; i++) {
        data[i] ^= ctx.derived_keys[round][(i + round * 17) % KEY_LENGTH];
    }
    
    // 跳过逆向第3步（循环移位）
    
    // 逆向第2步
    inverse_substitute_bytes(data, 16, INV_SBOX);
    
    // 逆向第1步
    xor_block(data, ctx.derived_keys[round], 16);
    
    printf("解密数据: ");
    for (int i = 0; i < 16; i++) printf("%02x ", data[i]);
    printf("\n");
    
    // 验证
    int success = (memcmp(data, backup, 16) == 0);
    printf("结果: %s\n", success ? "✓ 成功（不含循环移位）" : "✗ 失败");
    
    if (!success) {
        printf("差异:\n");
        for (int i = 0; i < 16; i++) {
            if (data[i] != backup[i]) {
                printf("位置 %d: 原始=0x%02x, 解密=0x%02x\n", i, backup[i], data[i]);
            }
        }
    }
}

// 专门测试循环移位
void test_rotate_only() {
    printf("\n=== 专门测试循环移位 ===\n");
    
    unsigned char data[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
                              0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
    unsigned char backup[16];
    
    memcpy(backup, data, 16);
    
    printf("原始数据: ");
    for (int i = 0; i < 16; i++) printf("%02x ", data[i]);
    printf("\n");
    
    // 测试左移3位
    rotate_left(data, 16, 3);
    
    printf("左移3位后: ");
    for (int i = 0; i < 16; i++) printf("%02x ", data[i]);
    printf("\n");
    
    // 右移3位恢复
    rotate_right(data, 16, 3);
    
    printf("右移3位后: ");
    for (int i = 0; i < 16; i++) printf("%02x ", data[i]);
    printf("\n");
    
    int success = (memcmp(data, backup, 16) == 0);
    printf("循环移位测试: %s\n", success ? "✓ 成功" : "✗ 失败");
}

int main() {
    test_rotate_only();
    minimal_test();
    return 0;
}